# _*_conding:cp-1252-*-
# 教育机构：银杰教育
# 讲师：李伟
# 开发时间：2025/8/30 下午11:45
"""
夹具[pytest里是前置和后置的统称-fixture]： 每个用例执行之前 /之后 都要做的操作  没有 必要每个用例都写一遍。
统一定义为 前置 或者后置 。调用这个前置后置 之后就可以自动执行。
- 目的： 简化代码 实现更加灵活。

fixture:
- 夹具的名称不用固定 自己定义 【区别于unitest】
- 定义夹具的时候： @pytest.fixture  申明一下是夹具  否则 就是一个普通函数.
    - 前置代码： 用例执行之前运行
    - 后置代码： 用例执行之后运行
- 夹具定义完之后，要在用例方法里调用 ： 方法括号里写上夹具名字
  - 报错：fixture 'setup_teardown' not found  夹具没找到
- 如何在一个夹具里区分前置 还是后置？
 - 如果默认情况下： 全部当前前置执行
 - yield 区分前置和后置： yield之前的是前置  yield之后的是后置。
    - 生成器： 测试开发的技术栈

使用场景：
* 接口： 购物车模块先登录 --登录结果
    - 购物车操作，必须先登录- 返回token 鉴权，购物车接口带上这个token
* UI： 每次用例 打开浏览器 --driver

yield设置夹具的返回值： 夹具的方法 有执行后的数据 需要给其他的调用夹具的用例使用，设置为夹具的返回值.
- 直接加载yield后面 ： 类似于函数return，不会遇到yield结束
- 调用夹具的时候： 可以直接获取夹具的名字 获取返回值.
- 设置多个返回值： 用英文的逗号的隔开 ，接受的时候用元组保存.

夹具作用域：
1、定义在普通的py文件里，作用域就是这个文件，跨文件不能直接使用；但是可以导入包使用；
  - 如果有很多的测试用例模块都需要用夹具  导包很麻烦。
2、夹具的共享： conftest.py夹具的共享。放在和pytes.ini同级别。
"""

# fixture 更适合：
# 测试前的环境准备（如登录获取 token、启动浏览器）；
# 测试后的资源清理（如关闭连接、删除测试数据）；
# 跨用例共享的工具 / 配置（如数据库连接实例、全局配置）；
# 带参数化的数据生成（结合 params 实现简单数据驱动）。

# DDT 更适合：
# 纯数据驱动场景（如接口的多组入参校验、表单的多组错误输入测试）；
# 从外部文件（CSV、Excel）读取静态数据并批量注入用例；
# 快速实现 “一条用例代码对应 N 组数据” 的场景（如单元测试的多输入验证）。


"""
了解：4个级别
- function 函数级别  -- 默认  ， 用默认的更多 其他的级别的夹具用到比较少。
  - 只对当前的用例方法生效，其他的没有调用不生效
  - 函数前后的执行的前置和后置
- class  类级别
  - 类前后执行的前置和后置
- session  会话级别
- module  模块级别

"""
# def test_ddt_demo(login_api):  # 调用夹具 夹具名字-- 只是会执行夹具里的代码
#     token,id=login_api  # 两个变量分别去接受两个返回值 a,b = 10,20
#     print(f"登录接口的夹具的返回值token是{token},id是{id}")  # 用夹具名字拿返回值
#     print("执行购物车的测试用例..")

# 注意：因为未导入，所以用的是全局共享文件conftest.py

class TestFx:
    def test_01_fx(self,login_api): # 只能第一个方法里调用类夹具
        print("执行测试用例333..")

    def test_02_fx(self,login_api):
        print("执行测试用例666..")